package de.hska.bestellverwaltung.ui;

import static de.hska.util.LogUtil.begin;
import static de.hska.util.LogUtil.end;
import static de.hska.util.WebConstants.BESTELLVERWALTUNG_UI_BEAN;

import java.util.List;
import java.util.Map;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import de.hska.artikelverwaltung.db.Artikel;

public class ArtikelAuswaehlenListShuttleConverter implements Converter {
	private static final Log LOG = LogFactory.getLog(ArtikelAuswaehlenListShuttleConverter.class);
	private static final boolean DEBUG = LOG.isDebugEnabled();

	public Object getAsObject(FacesContext context, UIComponent component, String value) {
		if (DEBUG) begin(LOG, value);
		
		final Long artikelId = Long.valueOf(value);
		
		final Map<String, Object> sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
		final BestellverwaltungUiBean bestellungen = (BestellverwaltungUiBean) sessionMap.get(BESTELLVERWALTUNG_UI_BEAN);
		
		// Suche in der Menge der verfuegbaren Artikel
		// Bei rich:listShuttle ist die Ausgangsmenge i.a. klein und damit auch der Suchaufwand
		// Alternative: Suche in der DB bzw. im L2-Cache mit artikelId
		//              jedoch Probleme hier im Converter, falls das Objekt konkurrierend geloescht wurde 
		final List<Artikel> verfuegbareArtikel = bestellungen.getVerfuegbareArtikel();
		Artikel artikel = null;
		for (Artikel tmp: verfuegbareArtikel) {
			if (tmp.getId().longValue() == artikelId.longValue()) {
				artikel = tmp;
				break;
			}
		}
		
		if (DEBUG) end(LOG, artikel);
		return artikel;
	}

	public String getAsString(FacesContext context, UIComponent component, Object value) {
		if (DEBUG) begin(LOG, value);
		
		final Artikel artikel = (Artikel) value;
		final String artikelId = artikel.getId().toString();
		
		if (DEBUG) end(LOG, artikelId);
		return artikelId;
	}
}
